package com.pc_project.controller;


import com.auth0.jwt.interfaces.DecodedJWT;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.pc_project.domain.Letter;
import com.pc_project.domain.LetterType;
import com.pc_project.domain.VO.JsonVO;
import com.pc_project.service.LetterService;
import com.pc_project.utils.RedisCache;
import com.pc_project.utils.TokenUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author iceberg-work
 */
@RestController
@RequestMapping("/letter")
@Api(tags = "信件分组")
public class LetterController {

    @Autowired
    LetterService letterService;

    /**
     * 发送信件
     *
     * @param request 请求
     * @param ltId  信件类型id
     * @param lInfo 信件内容
     * @return 是否成功（<code>boolean</code>）
     */
    @ApiOperation("发送信件")
    @ResponseBody
    @PostMapping("/sendLetter")
    public JsonVO<Boolean> sendLetter(@RequestParam Integer ltId, @RequestParam String lInfo, HttpServletRequest request) {
        Integer userId = getUserId(request);
        JsonVO<Boolean> check = checkUserId(userId);
        if(check != null) {
            return check;
        }
        return getJsonVoBoolean(letterService.sendLetter(userId, ltId, lInfo));
    }

    /**
     * 咨询者修改信件内容
     *
     * @param request 请求
     * @param lId   信件类别id
     * @param lInfo 信件内容
     * @return 是否成功（<code>boolean</code>）
     */
    @ApiOperation("咨询者修改信件内容")
    @ResponseBody
    @PostMapping("/updateLetter")
    public JsonVO<Boolean> updateLetter(@RequestParam Integer lId, @RequestParam String lInfo, HttpServletRequest request) {
        Integer userId = getUserId(request);
        JsonVO<Boolean> check = checkUserId(userId);
        if(check != null) {
            return check;
        }
        return getJsonVoBoolean(letterService.updateLetter(userId, lId, lInfo));
    }

    /**
     * 撤回信件
     *
     * @param request 请求
     * @param lId 信件id
     * @return 是否成功（<code>boolean</code>）
     */
    @ApiOperation("撤回信件")
    @ResponseBody
    @PostMapping("/delete")
    public JsonVO<Boolean> delete(@RequestParam Integer lId, HttpServletRequest request) {
        Integer userId = getUserId(request);
        JsonVO<Boolean> check = checkUserId(userId);
        if(check != null) {
            return check;
        }
        return getJsonVoBoolean(letterService.delete(userId, lId));
    }

    /**
     * 查询信件类别
     *
     * @param request 请求
     * @param letter 信件
     * @return 信件类别（<code>LetterType</code>）
     */
    @ApiOperation("查询信件类别")
    @ResponseBody
    @PostMapping("/queryLetterType")
    public JsonVO<LetterType> queryLetterType(@RequestBody Letter letter, HttpServletRequest request) {
        Integer userId = getUserId(request);
        JsonVO<LetterType> check = checkUserId(userId);
        if(check != null) {
            return check;
        }
        if (letter != null) {
            LetterType assertion = letterService.queryLetterType(letter);
            if(assertion != null) {
                if(letter.getLtId() != 0 && !letter.getLtId().equals(assertion.getLtId())) {
                    JsonVO<LetterType> fail = JsonVO.fail(null);
                    fail.setMessage("前端传递的ltid与数据库中对应记录中的ltid不符");
                    return fail;
                }
                return JsonVO.success(assertion);
            }
        }
        return JsonVO.fail(null);
    }


    /**
     * 信件池查询信件
     *
     * @param request 请求
     * @param pageSize   分页大小（必填）
     * @param pageNumber 分页页码（必填）
     * @param ltId       根据类别查询
     * @return 信件池（<code>com.github.pagehelper.Page</code>）
     */
    @ApiOperation("信件池查询信件")
    @ResponseBody
    @PostMapping("/queryAll")
    public JsonVO<com.github.pagehelper.Page> queryAll(com.pc_project.domain.VO.Page page, Integer ltId, HttpServletRequest request) {
        Integer userId = getUserId(request);
        JsonVO<com.github.pagehelper.Page> check = checkUserId(userId);
        if(check != null) {
            return check;
        }
        page = checkPage(page);
        com.github.pagehelper.Page assertion = (com.github.pagehelper.Page)letterService.queryAll(userId, page, ltId);
        return JsonVO.success(assertion);
    }

    /**
     * 查询该用户信件
     *
     * @param request 请求
     * @param ltId        根据信件类别查询
     * @param pageNumber 分页页码（必填）
     * @param pageSize   分页大小（必填）
     * @return 用户信件（<code>com.github.pagehelper.Page</code>）
     */
    @ApiOperation("查询该用户信件")
    @ResponseBody
    @PostMapping("/queryLetter")
    public JsonVO<com.github.pagehelper.Page> queryLetter(@RequestParam Integer ltId, com.pc_project.domain.VO.Page page, HttpServletRequest request) {
        Integer userId = getUserId(request);
        JsonVO<com.github.pagehelper.Page> check = checkUserId(userId);
        if(check != null) {
            return check;
        }
        if (ltId == null) {
            return JsonVO.fail(null);
        }
        page = checkPage(page);
        com.github.pagehelper.Page assertion = (com.github.pagehelper.Page)letterService.queryLetter(userId, ltId, page);
        return JsonVO.success(assertion);
    }

    /**
     * 依据Boolean获取JsonVO
     *
     * @param assertion 断言
     * @return success或者fail（<code>JsonVO</code>）
     */
    public JsonVO<Boolean> getJsonVoBoolean(Boolean assertion) {
        if (Boolean.TRUE.equals(assertion)) {
            return JsonVO.success(true);
        }
        return JsonVO.fail(false);
    }

    /**
     * 从token中取出userId
     *
     * @param request HttpServletRequest
     * @return UserId（<code>Integer</code>）
     */
    public Integer getUserId(HttpServletRequest request) {
        String token = request.getHeader("token");
        DecodedJWT decodedJWT = TokenUtils.parseJWT(token);
        return Integer.valueOf(decodedJWT.getSubject());
    }

    /**
     * 检查userId是否为空
     *
     * @param userId 从token取出的用户id
     * @return 合理的userId
     */
    public JsonVO checkUserId(Integer userId) {
        if(userId == null) {
            JsonVO fail = JsonVO.fail(false);
            fail.setMessage("userId为空");
            return fail;
        }
        return null;
    }

    /**
     * 检查Page是否为空
     *
     * @param page 分页对象
     * @return 合理的Page
     */
    public com.pc_project.domain.VO.Page checkPage(com.pc_project.domain.VO.Page page) {
        if (page.getPageNumber() == null) {
            page.setPageNumber(1);
        }
        if (page.getPageSize() == null) {
            page.setPageNumber(10);
        }
        return page;
    }
}